В тридевятом царстве, в тридесятом государстве жили-были, не тужили, по-английски говорили Кен Томпсон и Деннис Ритчи. Но наскучила им басурманская речь, и придумали они новый язык. Да так ловко, что целые армии программистов по белу свету восприняли язык, как родной. Появились и проповедники языка С, и его адепты, и даже отдельные секты со своими священными сводами законов и правил, аки секта поклонников С++ во главе с Бьёрном Страуструпом. Но в основе своей все они жили по одному канону, установленному основоположниками языка.
Но не каждый последователь Кена и Денниса, даже свободно говоривший на этом языке, знал все его тонкости и особенности. И вот один из таких стал проверять, не поменялась ли некая матрица, не зная правил явного и неявного преобразования типов данных. И был очень возмущён небрежностью и нерадивостью авторов компилятора из секты Столлмана, которые в операции сравнения не приводили результат, возвращаемый функцией, к типу double
. А ведь свод законов говорит о том, что результат вычисления будет преобразовываться к наиболее точному типу данных из тех, которые в нем участвуют. А также о том, что и при сравнении разных типов они сначала приводятся к наиболее точному (если, конечно, обратное не указано программистом путём применения явного преобразования типов).
Да, ошибка в функции проверки матрицы была найдена точно. Вот только виновными были объявлены почему-то разработчики компилятора, а не автор исходного кода.
И да, неявное преобразование типов в С/С++, к которому надо относиться очень внимательно — страшная вещь, особенно когда пишутся кроссплатформенные приложения. Не зря в одной толстой священной книге от Страуструпа этому вопросу отведена чуть ли не целая глава.